﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Microsoft.Phone.Scheduler;
using ViewModel;
using System.IO.IsolatedStorage;
using Tuzzit_Modele;

namespace Tuzzit
{
    public partial class App : Application
    {

        //Global var

        public CookieCollection Cookies { set; get; }
        public MyViewModelClass Motd { set; get; } //using ViewModel via Réference
        private const string TASK_NAME = "BackgroundAlarm";
        public IsolatedStorageSettings myStorage;
        public int CollectionItem;
        
        
        /// <summary>
        /// Permet d'accéder facilement au frame racine de l'application téléphonique.
        /// </summary>
        /// <returns>Frame racine de l'application téléphonique.</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Constructeur pour l'objet Application.
        /// </summary>
        public App()
        {
            // Initialisation de l'IS
            myStorage = IsolatedStorageSettings.ApplicationSettings;

            // Gestionnaire global pour les exceptions non interceptées. 
            UnhandledException += Application_UnhandledException;

            // Initialisation Silverlight standard
            InitializeComponent();

            // Initialisation spécifique au téléphone

            InitializePhoneApplication();

            // Affichez des informations de profilage graphique lors du débogage.
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Affichez les compteurs de fréquence des trames actuels.
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // Affichez les zones de l'application qui sont redessinées dans chaque frame.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Activez le mode de visualisation d'analyse hors production, 
                // qui montre les zones d'une page sur lesquelles une accélération GPU est produite avec une superposition colorée.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;

                // Désactivez la détection d'inactivité de l'application en définissant la propriété UserIdleDetectionMode de l'objet
                // PhoneApplicationService de l'application sur Désactivé.
                // Attention :- À utiliser uniquement en mode de débogage. Les applications qui désactivent la détection d'inactivité de l'utilisateur continueront de s'exécuter
                // et seront alimentées par la batterie lorsque l'utilisateur ne se sert pas du téléphone.
                PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
            }

        }

        // Code à exécuter lorsque l'application démarre (par exemple, à partir de Démarrer)
        // Ce code ne s'exécute pas lorsque l'application est réactivée
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            //Recherche dans l'Isolated Storage et si il y a qqc on rajoute à la collection
            /*if (IsolatedStorageSettings.ApplicationSettings.Contains("collection"))
            {
                Motd = (MyViewModelClass)IsolatedStorageSettings.ApplicationSettings["collection"];
            }*/

            Motd = new MyViewModelClass(); //Création d'une collection vide
            int InIS = myStorage.Count();
            int a = 0;
            String tmp="";
            if (InIS != 0) 
            {
                while (a < InIS)
                {
                    tmp = (String)IsolatedStorageSettings.ApplicationSettings["collection" + a];
                    Motd.MyItems.Add(new ModeleMessage(tmp));
                    a++;
                }
            }


           try
           {
                PeriodicTask myPeriodicTask = ScheduledActionService.Find(TASK_NAME) as PeriodicTask;
                if (myPeriodicTask != null)
                { 
                    ScheduledActionService.Remove(TASK_NAME); 
                }
                myPeriodicTask = new PeriodicTask(TASK_NAME);
                myPeriodicTask.Description = "Check version"; //N.B. Description is mandatory
                ScheduledActionService.Add (myPeriodicTask);
                #if DEBUG
                // If we're debugging, attempt to start the task immediately 
                ScheduledActionService.LaunchForTest(TASK_NAME, TimeSpan.FromSeconds(5));
                #endif
           }
           catch (Exception ex)
           { 
               MessageBox.Show("==============="+ex);
           }
        }

        // Code à exécuter lorsque l'application est activée (affichée au premier plan)
        // Ce code ne s'exécute pas lorsque l'application est démarrée pour la première fois
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
            //Rechercher dans IS si et rajouter dans collection observable
            int InIS = myStorage.Count();
            int a = 0;
            while (a < InIS)
            {
                Motd.MyItems.Add(new ModeleMessage((String)myStorage["collection" + a]));
                a++;
            }
            
        }

        // Code à exécuter lorsque l'application est désactivée (envoyée à l'arrière-plan)
        // Ce code ne s'exécute pas lors de la fermeture de l'application
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            // l'appli est désactivée, la page est quittée
            // PhoneApplicationService.Current.State["Cookies"] = Cookies.;
            //Stocker en isolated Storage
            CollectionItem = Motd.MyItems.Count();
            int countstorage = myStorage.Count();
            int i = 0;
            while (i < CollectionItem)
            {
                //IsolatedStorageSettings.ApplicationSettings["collection" + i] = Motd;
                if (myStorage.Contains("collection" + i))
                {
                    myStorage["collection" + i] = Motd.MyItems.ElementAt(i).MessageToAdd;
                }
                else
                {
                    myStorage.Add("collection" + i, Motd.MyItems.ElementAt(i).MessageToAdd);
                }

                i++;
            }

            while (i < countstorage)
            {
                myStorage.Remove("collection" + i);

                i++;
            }
            myStorage.Save();
        }

        // Code à exécuter lors de la fermeture de l'application (par exemple, lorsque l'utilisateur clique sur Précédent)
        // Ce code ne s'exécute pas lorsque l'application est désactivée
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
            //Stocker en isolated Storage
            CollectionItem = Motd.MyItems.Count();
            int countstorage = myStorage.Count();
            int i=0;
            while (i < CollectionItem) 
            {
                //IsolatedStorageSettings.ApplicationSettings["collection" + i] = Motd;
                if (myStorage.Contains("collection" + i))
                {
                    myStorage["collection" + i] = Motd.MyItems.ElementAt(i).MessageToAdd;
                }
                else
                {
                    myStorage.Add("collection" + i, Motd.MyItems.ElementAt(i).MessageToAdd);
                }
                
                i++;
            }

            while (i < countstorage)
            {
                myStorage.Remove("collection" + i);
             
                i++;
            }
            myStorage.Save();
        }

        // Code à exécuter en cas d'échec d'une navigation
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Échec d'une navigation ; arrêt dans le débogueur
                System.Diagnostics.Debugger.Break();
            }
        }

        // Code à exécuter sur les exceptions non gérées
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Une exception non gérée s'est produite ; arrêt dans le débogueur
                System.Diagnostics.Debugger.Break();
            }
        }

        #region Initialisation de l'application téléphonique

        // Éviter l'initialisation double
        private bool phoneApplicationInitialized = false;

        // Ne pas ajouter de code supplémentaire à cette méthode
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // Créez le frame, mais ne le définissez pas encore comme RootVisual ; cela permet à l'écran de
            // démarrage de rester actif jusqu'à ce que l'application soit prête pour le rendu.
            //RootFrame = new PhoneApplicationFrame();
            RootFrame = new TransitionFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // Gérer les erreurs de navigation
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // Garantir de ne pas retenter l'initialisation
            phoneApplicationInitialized = true;
        }

        // Ne pas ajouter de code supplémentaire à cette méthode
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // Définir le Visual racine pour permettre à l'application d'effectuer le rendu
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // Supprimer ce gestionnaire, puisqu'il est devenu inutile
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        #endregion
    }
}